const ChatController = {
  users: new Map(), // 使用 Map 存储用户，键为 socket.id
  messages: [], // 存储消息历史
  maxHistorySize: 100, // 最大历史消息数量

  // 处理 WebSocket 连接
  async handleConnection(ctx) {
    console.log('in');

    const socket = ctx.websocket;
    const socketId = +new Date();
    console.log('in2');
    // 初始时设置为匿名用户
    const user = {
      id: socketId,
      username: `Guest_${Math.random().toString(36).substr(2, 8)}`,
      socket,
      send: (data) => {
        if (socket.readyState === 1) {
          // OPEN 状态
          socket.send(JSON.stringify(data));
        }
      },
    };

    ChatController.users.set(socketId, user);

    // 发送欢迎消息和历史消息
    ChatController.sendWelcomeMessage(user);
    ChatController.sendHistoryMessages(user);

    // 广播用户加入
    ChatController.broadcastUserJoin(user);

    // 监听消息事件
    socket.on('message', async (message) => {
      console.log('in message');

      try {
        const data = JSON.parse(message);

        switch (data.type) {
          case 'setUsername':
            ChatController.handleSetUsername(user, data.username);
            break;

          case 'chatMessage':
            ChatController.handleChatMessage(user, data.content);
            break;

          default:
            console.log('未知消息类型:', data.type);
            break;
        }
      } catch (error) {
        console.error('消息解析错误:', error);
      }
    });

    // 监听连接关闭事件
    socket.on('close', () => {
      ChatController.handleDisconnect(user);
    });

    // 监听错误事件
    socket.on('error', (error) => {
      console.error(`用户 ${user.username} 的 WebSocket 错误:`, error);
    });
  },

  // 发送欢迎消息
  sendWelcomeMessage(user) {
    user.send({
      type: 'system',
      message: `欢迎来到聊天室，${user.username}!`,
      timestamp: new Date().toISOString(),
    });
  },

  // 发送历史消息
  sendHistoryMessages(user) {
    user.send({
      type: 'history',
      messages: ChatController.messages,
    });
  },

  // 广播用户加入
  broadcastUserJoin(user) {
    const message = {
      content: `${user.username} 加入了聊天室`,
      username: 'System',
      timestamp: new Date().toISOString(),
    };
    ChatController.broadcastMessage(message);
  },

  // 处理设置用户名
  handleSetUsername(user, newUsername) {
    if (
      !newUsername ||
      typeof newUsername !== 'string' ||
      newUsername.trim() === ''
    ) {
      return;
    }

    const oldUsername = user.username;
    user.username = newUsername.trim();

    // 通知用户用户名已更改
    user.send({
      type: 'system',
      message: `您的用户名已更改为 ${user.username}`,
      timestamp: new Date().toISOString(),
    });

    // 广播用户名更改
    const message = {
      content: `${oldUsername} 更改为 ${user.username}`,
      username: 'System',
      timestamp: new Date().toISOString(),
    };
    ChatController.broadcastMessage(message);
  },

  // 处理聊天消息
  handleChatMessage(user, content) {
    if (!content || typeof content !== 'string' || content.trim() === '') {
      return;
    }

    const message = {
      content: content.trim(),
      username: user.username,
      timestamp: new Date().toISOString(),
    };

    // 添加到消息历史
    ChatController.messages.push(message);

    // 保持消息历史在限制范围内
    if (ChatController.messages.length > ChatController.maxHistorySize) {
      ChatController.messages.shift(); // 移除最旧的消息
    }

    // 广播消息
    ChatController.broadcastMessage(message);
  },

  // 广播消息给所有用户
  broadcastMessage(message) {
    ChatController.users.forEach((user) => {
      user.send({
        type: 'chat',
        message,
      });
    });
  },

  // 处理断开连接
  handleDisconnect(user) {
    ChatController.users.delete(user.id);

    // 广播用户离开
    const message = {
      content: `${user.username} 离开了聊天室`,
      username: 'System',
      timestamp: new Date().toISOString(),
    };
    ChatController.broadcastMessage(message);

    console.log(`用户 ${user.username} 离开了聊天室`);
  },
};

module.exports = ChatController;
